#STEP 1: Choose the variables

We aim to investigate whether COVID-19 severity influences COL11A2 expression, whether patient sex affects COL11A2 expression and whether there is an interaction between sex and disease severity in determining COL11A2 levels. We investigate three questions (H0 = null hypothesis and H1= alternative hypothesis):

H0a: The mean standardized COL11A2 expression is equal across all COVID-19 severity groups. H1a: At least one COVID-19 severity group has a different mean standardized COL11A2 expression.

H0b: The mean standardized COL11A2 expression is equal between male and female patients. H1b: The mean standardized COL11A2 expression differs between male and female patients.

H0c: There is no interaction between sex and COVID-19 severity on mean standardized COL11A2 expression. H1c: The effect of COVID-19 severity on mean standardized COL11A2 expression differs between males and females.

Why COL11A2? This protein was selected because it was mentioned in the reference article. COL11A2 is a collagen component involved in two pathways that were found to be downregulated in severe COVID-19: Integrin cell surface interactions and Collagen biosynthesis and modifying enzymes. Since these pathways include multiple collagen proteins, COL11A2 is a biologically meaningful candidate for investigating severity-associated differences.

#install.packages("ggpubr")

library(ggplot2)
library(dplyr)
library(ggpubr)
library(tidyverse)

#STEP 2: Make the dataset To test our hypotheses, we need a dataset that contains both the clinical variables (sex and WHO_temp_severity) and the standardized, log-transformed expression values of the protein of interest (COL11A2). These variables originate from different sections of the full dataset, so a new dataframe must be constructed.

During the earlier data-exploration phase, we verified that there were no missing values in sex, WHO_temp_severity or the COL11A2 protein measurements. Therefore, no additional imputation or row removal is required in this preprocessing step.

We proceed by importing the full dataset, extracting the protein expression matrix, applying a log-transformation followed by standardization (z-scaling), and combining it with the relevant clinical features into a single analysis-ready dataframe.

# Import whole dataset
combined_dataset <- read.csv("combined_dataset.csv")

# Split dataset in subsets
combined_dataset_protein <-combined_dataset[,1:7241]
proteins_log <- log(combined_dataset_protein[,2:7241])
proteins_scaled <- as.data.frame(scale(proteins_log))

feature_df <-combined_dataset[,7242:7258]

data_multivariate <- data.frame( COL11A2 = proteins_scaled$COL11A2, severity = feature_df$WHO_temp_severity, sex = feature_df$sex)
data_multivariate$severity <- factor(data_multivariate$severity, levels = c("NEGATIVE", "mild", "moderate", "severe", "critical"))

#STEP 3: Check for outliers To identify potential extreme values, we will calculate the interquartile range (IQR) of COL11A2 and determine which observations fall outside the 1.5×IQR boundaries, as these will be considered statistical outliers.

protein <- combined_dataset$COL11A2

Q1 <- quantile(protein, 0.25, na.rm = TRUE)
Q3 <- quantile(protein, 0.75, na.rm = TRUE)
IQR_value <- IQR(protein, na.rm = TRUE)

lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

outliers <- protein[protein < lower_bound | protein > upper_bound]

outliers
 [1] 14059.1 11043.5  8828.0  8977.9 10079.4  9938.0 10522.9  8040.3  9685.6 11337.0  8650.3 11166.6 11076.8 12590.7  9094.0 11050.3  8299.4
[18] 10443.6 14506.3 13175.1  9877.9 13243.2 13882.3
ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill= severity)) +
  geom_boxplot(outliers = FALSE) +
  geom_jitter (width =0.15, alpha =0.4, color = "black") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()+
  labs(title = "COL11A2 levels across the different severity groups")

INTERPRETATION: Although several outliers are present (as seen in boxplot), there is no evidence of measurement or data-entry error and the values appear biologically plausible. Since we have no objective reason to exclude them, the outliers were retained for all subsequent analyses.

#STEP 4: Data exploration

We first visualized the distribution of log-transformed and standardized COL11A2 across the different Covid-19 severity levels. This showed that COL11A2 will be downregulated as Covid-19 becomes more severe

ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill= severity)) +
  geom_boxplot(outliers = FALSE) +
  geom_jitter (width =0.15, alpha =0.4, color = "black") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()+
  labs(title = "COL11A2 levels across the different severity groups", x = "severity groups", y = "Standardized log(COL11A2) expression")

We also looked at the distribution of COL11A2 in male and female patients. We noticed that there was no big difference between the two groups.

ggplot(data_multivariate, aes(x = sex, y = COL11A2, fill= sex)) +
  geom_boxplot(outliers = FALSE) +
  geom_jitter (width =0.15, alpha =0.4, color = "black") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()+
  labs (title = "Sex-Based Differences in COL11A2 Expression ")

Interpretation: Only within the severe and critical groups do we observe a more pronounced difference between male and female patients. This may be explained by the limited sample size in these categories, as well as potential imbalance in sex distribution. Based on this boxplot, we could hypothesize that COL11A2 protein expression is progressively downregulated with increasing COVID-19 severity.

#STEP 5: Check assumptions

Normalization of protein COL11A2

ggqqplot(proteins_scaled$COL11A2) +
  ylim(0,5)+
  xlim(0,3)+ 
  labs(title = "Normalization of COL11A2", x= NULL, y=NULL)

The QQ-plot shows that COL11A2 values follow the theoretical normal distribution reasonably well, with only mild deviations in the upper tail.

Normalization of COL11A2 within severity groups

data_multivariate %>%
  ggplot(aes(sample = COL11A2)) +
  geom_qq() + 
  geom_qq_line() +
  facet_wrap(~severity) +
  labs( title= "Normalization of COL11A2 within severity groups" )

We assessed the normality of COL11A2 within each severity group using QQ-plots. Across groups, the distributions follow the theoretical normal line reasonably well, with mild deviations, especially in the severe and critical categories, largely attributable to small sample sizes and a few extreme observations. These deviations are not substantial enough to violate the normality assumption for the subsequent ANOVA.

Normalization of COL11A2 within sex groups

data_multivariate %>%
  ggplot(aes(sample = COL11A2)) +
  geom_qq() + 
  geom_qq_line() +
  facet_wrap(~sex)+
  labs( title= "Normalization of COL11A2 within sex groups" )

INTERPRETATION: The distribution deviates slightly from perfect normality due to the presence of a few outliers, but overall the residual pattern remains sufficiently close to normal for the assumptions of the model to hold.

Check assumptions based on a simple linear regression model

lm_COL11A2 <- lm(COL11A2 ~ sex + severity + sex*severity, data= data_multivariate)
plot(lm_COL11A2)

INTERPRETATION:

STEP 6: The two-sample Anova test

Because our data is approximately normally distributed, we selected a two-way ANOVA to test our multivariate hypothesis.

anova_model <- aov( COL11A2 ~ severity + sex + severity * sex , data = data_multivariate)
summary(anova_model)
              Df Sum Sq Mean Sq F value Pr(>F)    
severity       4  89.52  22.380  34.804 <2e-16 ***
sex            1   0.70   0.705   1.096  0.296    
severity:sex   4   1.23   0.309   0.480  0.751    
Residuals    231 148.54   0.643                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(effectsize)

eta_squared(anova_model)
# Effect Size for ANOVA (Type I)

Parameter    | Eta2 (partial) |       95% CI
--------------------------------------------
severity     |           0.38 | [0.29, 1.00]
sex          |       4.72e-03 | [0.00, 1.00]
severity:sex |       8.24e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

INTERPRETATION: At the 5% significance level, the two-way ANOVA shows a statistically significant effect of COVID-19 severity on standardized log-transformed COL11A2 expression (F(4, 231) = 34.8, p < 0.001). In contrast, neither sex (F(1, 231) = 1.10, p = 0.296) nor the interaction between sex and severity (F(4, 231) = 0.48, p = 0.751) is significant. We therefore reject the null hypothesis for severity, but do not reject the null hypotheses for sex and for the sex-severity interaction.

effect size: COVID-19 severity shows a large effect on COL11A2 expression (partial η² = 0.38), indicating that approximately 38% of the variance is explained by severity. In contrast, sex and the sex×severity interaction have negligible effect sizes (partial η² < 0.01).

The anova model was repeated for the interaction between COL11A2 and severity to use for the post hoc analysis

sign_anova <- aov( COL11A2 ~ severity , data = data_multivariate)
summary(sign_anova)
             Df Sum Sq Mean Sq F value Pr(>F)    
severity      4  89.52  22.380    35.1 <2e-16 ***
Residuals   236 150.48   0.638                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

#STEP 7: Post hoc analyse

We know that Covid-19 severity has a significant effect on the expression of COL11A2. It is important that we do a Post-hoc test to find out for which groups the expression is significantily different.

#install.packages("multcomp")
library(multcomp)

mcp <- glht(sign_anova,linfct = mcp (severity = 'Tukey' ))
summary(mcp)

     Simultaneous Tests for General Linear Hypotheses

Multiple Comparisons of Means: Tukey Contrasts


Fit: aov(formula = COL11A2 ~ severity, data = data_multivariate)

Linear Hypotheses:
                         Estimate Std. Error t value Pr(>|t|)    
mild - NEGATIVE == 0      -0.5923     0.1354  -4.373 0.000168 ***
moderate - NEGATIVE == 0  -1.1851     0.1583  -7.489  < 1e-04 ***
severe - NEGATIVE == 0    -1.7688     0.1937  -9.130  < 1e-04 ***
critical - NEGATIVE == 0  -2.0581     0.2471  -8.328  < 1e-04 ***
moderate - mild == 0      -0.5928     0.1390  -4.264 0.000249 ***
severe - mild == 0        -1.1764     0.1784  -6.595  < 1e-04 ***
critical - mild == 0      -1.4658     0.2353  -6.230  < 1e-04 ***
severe - moderate == 0    -0.5836     0.1963  -2.974 0.024695 *  
critical - moderate == 0  -0.8730     0.2491  -3.504 0.004543 ** 
critical - severe == 0    -0.2893     0.2730  -1.060 0.817948    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
confint(mcp)$p
NULL

INTERPRETATION: The Tukey post-hoc test shows that mean standardized log-COL11A2 expression is significantly lower in all COVID-19 severity groups (mild, moderate, severe, critical) compared with the NEGATIVE group (all adjusted p < 0.001). For example, the critical group has on average 2.06 standard units lower COL11A2 expression than the NEGATIVE group (estimate = −2.06, 95% CI [−2.73, −1.39]). In addition, each successive increase in severity from mild to moderate, severe and critical is associated with a significant further decrease in COL11A2 expression (all adjusted p < 0.05), except for the contrast between severe and critical, where the 95% confidence interval includes zero (estimate = −0.29, 95% CI [−1.03, 0.45], p = 0.82). At a global 5% significance level we therefore conclude that COL11A2 expression decreases progressively with increasing COVID-19 severity.

Visualisation

This boxplots supports the results obtained via the two-way ANOVA test

library(ggplot2)


ggplot(data_multivariate, aes(x = severity, y = COL11A2, fill = sex)) +
  geom_boxplot(outliers = FALSE) +
  geom_jitter (width =0.15, alpha =0.4, color = "black") +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal() +
  labs(title = "The effect of sex and Covid-19 severity on COL11A2 expression", x = "severity groups", y = "Standardized log(COL11A2) expression")

FINAL CONCLUSION:

H0a (severity): We reject the null hypothesis (p < 0.001). COVID-19 severity has a significant effect on standardized log-COL11A2 expression. Both the ANOVA and Tukey post-hoc tests show a progressive decrease in COL11A2 levels from NEGATIVE → mild → moderate → severe → critical, with all pairwise differences significant except severe–critical. The boxplot visually confirms this downward trend, indicating that COL11A2 is strongly downregulated as disease severity increases.

H0b (sex): We do not reject the null hypothesis (p = 0.30). There is no statistically significant difference in mean COL11A2 expression between male and female patients. The figure shows substantial overlap between sexes in each severity category, supporting this result.

H0c (interaction): We do not reject the null hypothesis (p = 0.75). The effect of COVID-19 severity on COL11A2 expression does not differ between males and females. The boxplot shows small apparent sex differences only in the severe and critical groups, but these patterns are likely due to limited and imbalanced sample sizes rather than a true interaction.

Overall conclusion: Overall, COL11A2 expression decreases consistently with increasing COVID-19 severity, indicating a strong and significant severity effect visible in both the statistical tests and the final figure. Sex and the sex×severity interaction are not significant, and the minor visual differences in the most severe groups likely reflect small sample sizes rather than true biological effects. Thus, the severity-related decline in COL11A2 appears robust and independent of patient sex.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCiNTVEVQIDE6IENob29zZSB0aGUgdmFyaWFibGVzCgpXZSBhaW0gdG8gaW52ZXN0aWdhdGUgd2hldGhlciBDT1ZJRC0xOSBzZXZlcml0eSBpbmZsdWVuY2VzIENPTDExQTIgZXhwcmVzc2lvbiwgd2hldGhlciBwYXRpZW50IHNleCBhZmZlY3RzIENPTDExQTIgZXhwcmVzc2lvbiBhbmQgd2hldGhlciB0aGVyZSBpcyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNleCBhbmQgZGlzZWFzZSBzZXZlcml0eSBpbiBkZXRlcm1pbmluZyBDT0wxMUEyIGxldmVscy4gV2UgaW52ZXN0aWdhdGUgdGhyZWUgcXVlc3Rpb25zIChIMCA9IG51bGwgaHlwb3RoZXNpcyBhbmQgSDE9IGFsdGVybmF0aXZlIGh5cG90aGVzaXMpOgoKSDBhOiBUaGUgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uIGlzIGVxdWFsIGFjcm9zcyBhbGwgQ09WSUQtMTkgc2V2ZXJpdHkgZ3JvdXBzLgpIMWE6IEF0IGxlYXN0IG9uZSBDT1ZJRC0xOSBzZXZlcml0eSBncm91cCBoYXMgYSBkaWZmZXJlbnQgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uLgoKSDBiOiBUaGUgbWVhbiBzdGFuZGFyZGl6ZWQgQ09MMTFBMiBleHByZXNzaW9uIGlzIGVxdWFsIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBhdGllbnRzLgpIMWI6IFRoZSBtZWFuIHN0YW5kYXJkaXplZCBDT0wxMUEyIGV4cHJlc3Npb24gZGlmZmVycyBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBwYXRpZW50cy4KCkgwYzogVGhlcmUgaXMgbm8gaW50ZXJhY3Rpb24gYmV0d2VlbiBzZXggYW5kIENPVklELTE5IHNldmVyaXR5IG9uIG1lYW4gc3RhbmRhcmRpemVkIENPTDExQTIgZXhwcmVzc2lvbi4KSDFjOiBUaGUgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIG1lYW4gc3RhbmRhcmRpemVkIENPTDExQTIgZXhwcmVzc2lvbiBkaWZmZXJzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuICAKCldoeSBDT0wxMUEyPwpUaGlzIHByb3RlaW4gd2FzIHNlbGVjdGVkIGJlY2F1c2UgaXQgd2FzIG1lbnRpb25lZCBpbiB0aGUgcmVmZXJlbmNlIGFydGljbGUuIENPTDExQTIgaXMgYSBjb2xsYWdlbiBjb21wb25lbnQgaW52b2x2ZWQgaW4gdHdvIHBhdGh3YXlzIHRoYXQgd2VyZSBmb3VuZCB0byBiZSBkb3ducmVndWxhdGVkIGluIHNldmVyZSBDT1ZJRC0xOTogSW50ZWdyaW4gY2VsbCBzdXJmYWNlIGludGVyYWN0aW9ucyBhbmQgQ29sbGFnZW4gYmlvc3ludGhlc2lzIGFuZCBtb2RpZnlpbmcgZW56eW1lcy4gU2luY2UgdGhlc2UgcGF0aHdheXMgaW5jbHVkZSBtdWx0aXBsZSBjb2xsYWdlbiBwcm90ZWlucywgQ09MMTFBMiBpcyBhIGJpb2xvZ2ljYWxseSBtZWFuaW5nZnVsIGNhbmRpZGF0ZSBmb3IgaW52ZXN0aWdhdGluZyBzZXZlcml0eS1hc3NvY2lhdGVkIGRpZmZlcmVuY2VzLgoKCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwdWJyIikKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkodGlkeXZlcnNlKQoKYGBgCgojU1RFUCAyOiBNYWtlIHRoZSBkYXRhc2V0ClRvIHRlc3Qgb3VyIGh5cG90aGVzZXMsIHdlIG5lZWQgYSBkYXRhc2V0IHRoYXQgY29udGFpbnMgYm90aCB0aGUgY2xpbmljYWwgdmFyaWFibGVzIChzZXggYW5kIFdIT190ZW1wX3NldmVyaXR5KSBhbmQgdGhlIHN0YW5kYXJkaXplZCwgbG9nLXRyYW5zZm9ybWVkIGV4cHJlc3Npb24gdmFsdWVzIG9mIHRoZSBwcm90ZWluIG9mIGludGVyZXN0IChDT0wxMUEyKS4gVGhlc2UgdmFyaWFibGVzIG9yaWdpbmF0ZSBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucyBvZiB0aGUgZnVsbCBkYXRhc2V0LCBzbyBhIG5ldyBkYXRhZnJhbWUgbXVzdCBiZSBjb25zdHJ1Y3RlZC4KCkR1cmluZyB0aGUgZWFybGllciBkYXRhLWV4cGxvcmF0aW9uIHBoYXNlLCB3ZSB2ZXJpZmllZCB0aGF0IHRoZXJlIHdlcmUgbm8gbWlzc2luZyB2YWx1ZXMgaW4gc2V4LCBXSE9fdGVtcF9zZXZlcml0eSBvciB0aGUgQ09MMTFBMiBwcm90ZWluIG1lYXN1cmVtZW50cy4gVGhlcmVmb3JlLCBubyBhZGRpdGlvbmFsIGltcHV0YXRpb24gb3Igcm93IHJlbW92YWwgaXMgcmVxdWlyZWQgaW4gdGhpcyBwcmVwcm9jZXNzaW5nIHN0ZXAuCgpXZSBwcm9jZWVkIGJ5IGltcG9ydGluZyB0aGUgZnVsbCBkYXRhc2V0LCBleHRyYWN0aW5nIHRoZSBwcm90ZWluIGV4cHJlc3Npb24gbWF0cml4LCBhcHBseWluZyBhIGxvZy10cmFuc2Zvcm1hdGlvbiBmb2xsb3dlZCBieSBzdGFuZGFyZGl6YXRpb24gKHotc2NhbGluZyksIGFuZCBjb21iaW5pbmcgaXQgd2l0aCB0aGUgcmVsZXZhbnQgY2xpbmljYWwgZmVhdHVyZXMgaW50byBhIHNpbmdsZSBhbmFseXNpcy1yZWFkeSBkYXRhZnJhbWUuCmBgYHtyfQojIEltcG9ydCB3aG9sZSBkYXRhc2V0CmNvbWJpbmVkX2RhdGFzZXQgPC0gcmVhZC5jc3YoImNvbWJpbmVkX2RhdGFzZXQuY3N2IikKCiMgU3BsaXQgZGF0YXNldCBpbiBzdWJzZXRzCmNvbWJpbmVkX2RhdGFzZXRfcHJvdGVpbiA8LWNvbWJpbmVkX2RhdGFzZXRbLDE6NzI0MV0KcHJvdGVpbnNfbG9nIDwtIGxvZyhjb21iaW5lZF9kYXRhc2V0X3Byb3RlaW5bLDI6NzI0MV0pCnByb3RlaW5zX3NjYWxlZCA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlKHByb3RlaW5zX2xvZykpCgpmZWF0dXJlX2RmIDwtY29tYmluZWRfZGF0YXNldFssNzI0Mjo3MjU4XQoKZGF0YV9tdWx0aXZhcmlhdGUgPC0gZGF0YS5mcmFtZSggQ09MMTFBMiA9IHByb3RlaW5zX3NjYWxlZCRDT0wxMUEyLCBzZXZlcml0eSA9IGZlYXR1cmVfZGYkV0hPX3RlbXBfc2V2ZXJpdHksIHNleCA9IGZlYXR1cmVfZGYkc2V4KQpkYXRhX211bHRpdmFyaWF0ZSRzZXZlcml0eSA8LSBmYWN0b3IoZGF0YV9tdWx0aXZhcmlhdGUkc2V2ZXJpdHksIGxldmVscyA9IGMoIk5FR0FUSVZFIiwgIm1pbGQiLCAibW9kZXJhdGUiLCAic2V2ZXJlIiwgImNyaXRpY2FsIikpCmBgYAoKCiNTVEVQIDM6IENoZWNrIGZvciBvdXRsaWVycwpUbyBpZGVudGlmeSBwb3RlbnRpYWwgZXh0cmVtZSB2YWx1ZXMsIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBpbnRlcnF1YXJ0aWxlIHJhbmdlIChJUVIpIG9mIENPTDExQTIgYW5kIGRldGVybWluZSB3aGljaCBvYnNlcnZhdGlvbnMgZmFsbCBvdXRzaWRlIHRoZSAxLjXDl0lRUiBib3VuZGFyaWVzLCBhcyB0aGVzZSB3aWxsIGJlIGNvbnNpZGVyZWQgc3RhdGlzdGljYWwgb3V0bGllcnMuCmBgYHtyfQpwcm90ZWluIDwtIGNvbWJpbmVkX2RhdGFzZXQkQ09MMTFBMgoKUTEgPC0gcXVhbnRpbGUocHJvdGVpbiwgMC4yNSwgbmEucm0gPSBUUlVFKQpRMyA8LSBxdWFudGlsZShwcm90ZWluLCAwLjc1LCBuYS5ybSA9IFRSVUUpCklRUl92YWx1ZSA8LSBJUVIocHJvdGVpbiwgbmEucm0gPSBUUlVFKQoKbG93ZXJfYm91bmQgPC0gUTEgLSAxLjUgKiBJUVJfdmFsdWUKdXBwZXJfYm91bmQgPC0gUTMgKyAxLjUgKiBJUVJfdmFsdWUKCm91dGxpZXJzIDwtIHByb3RlaW5bcHJvdGVpbiA8IGxvd2VyX2JvdW5kIHwgcHJvdGVpbiA+IHVwcGVyX2JvdW5kXQoKb3V0bGllcnMKYGBgCmBgYHtyfQoKYm94cGxvdChwcm90ZWluLCBtYWluPSJCb3hwbG90IENPTDExQTIiLCB5bGFiPSJFeHByZXNzaW9uIikKCmBgYApJTlRFUlBSRVRBVElPTjoKQWx0aG91Z2ggc2V2ZXJhbCBvdXRsaWVycyBhcmUgcHJlc2VudCAoYXMgc2VlbiBpbiBib3hwbG90KSwgdGhlcmUgaXMgbm8gZXZpZGVuY2Ugb2YgbWVhc3VyZW1lbnQgb3IgZGF0YS1lbnRyeSBlcnJvciBhbmQgdGhlIHZhbHVlcyBhcHBlYXIgYmlvbG9naWNhbGx5IHBsYXVzaWJsZS4gU2luY2Ugd2UgaGF2ZSBubyBvYmplY3RpdmUgcmVhc29uIHRvIGV4Y2x1ZGUgdGhlbSwgdGhlIG91dGxpZXJzIHdlcmUgcmV0YWluZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGFuYWx5c2VzLgoKCiNTVEVQIDQ6IERhdGEgZXhwbG9yYXRpb24KCldlIGZpcnN0IHZpc3VhbGl6ZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBsb2ctdHJhbnNmb3JtZWQgYW5kIHN0YW5kYXJkaXplZCBDT0wxMUEyIGFjcm9zcyB0aGUgZGlmZmVyZW50IENvdmlkLTE5IHNldmVyaXR5IGxldmVscy4gVGhpcyBzaG93ZWQgdGhhdCBDT0wxMUEyIHdpbGwgYmUgZG93bnJlZ3VsYXRlZCBhcyBDb3ZpZC0xOSBiZWNvbWVzIG1vcmUgc2V2ZXJlCgpgYGB7cn0KZ2dwbG90KGRhdGFfbXVsdGl2YXJpYXRlLCBhZXMoeCA9IHNldmVyaXR5LCB5ID0gQ09MMTFBMiwgZmlsbD0gc2V2ZXJpdHkpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXJzID0gRkFMU0UpICsKICBnZW9tX2ppdHRlciAod2lkdGggPTAuMTUsIGFscGhhID0wLjQsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICJDT0wxMUEyIGxldmVscyBhY3Jvc3MgdGhlIGRpZmZlcmVudCBzZXZlcml0eSBncm91cHMiLCB4ID0gInNldmVyaXR5IGdyb3VwcyIsIHkgPSAiU3RhbmRhcmRpemVkIGxvZyhDT0wxMUEyKSBleHByZXNzaW9uIikKYGBgCldlIGFsc28gbG9va2VkIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgQ09MMTFBMiBpbiBtYWxlIGFuZCBmZW1hbGUgcGF0aWVudHMuIFdlIG5vdGljZWQgdGhhdCB0aGVyZSB3YXMgbm8gYmlnIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGdyb3Vwcy4KCmBgYHtyfQpnZ3Bsb3QoZGF0YV9tdWx0aXZhcmlhdGUsIGFlcyh4ID0gc2V4LCB5ID0gQ09MMTFBMiwgZmlsbD0gc2V4KSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVycyA9IEZBTFNFKSArCiAgZ2VvbV9qaXR0ZXIgKHdpZHRoID0wLjE1LCBhbHBoYSA9MC40LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMgKHRpdGxlID0gIlNleC1CYXNlZCBEaWZmZXJlbmNlcyBpbiBDT0wxMUEyIEV4cHJlc3Npb24gIikKCmBgYAoKSW50ZXJwcmV0YXRpb246Ck9ubHkgd2l0aGluIHRoZSBzZXZlcmUgYW5kIGNyaXRpY2FsIGdyb3VwcyBkbyB3ZSBvYnNlcnZlIGEgbW9yZSBwcm9ub3VuY2VkIGRpZmZlcmVuY2UgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgcGF0aWVudHMuIFRoaXMgbWF5IGJlIGV4cGxhaW5lZCBieSB0aGUgbGltaXRlZCBzYW1wbGUgc2l6ZSBpbiB0aGVzZSBjYXRlZ29yaWVzLCBhcyB3ZWxsIGFzIHBvdGVudGlhbCBpbWJhbGFuY2UgaW4gc2V4IGRpc3RyaWJ1dGlvbi4gQmFzZWQgb24gdGhpcyBib3hwbG90LCB3ZSBjb3VsZCBoeXBvdGhlc2l6ZSB0aGF0IENPTDExQTIgcHJvdGVpbiBleHByZXNzaW9uIGlzIHByb2dyZXNzaXZlbHkgZG93bnJlZ3VsYXRlZCB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHkuCgoKCiNTVEVQIDU6IENoZWNrIGFzc3VtcHRpb25zCgoqKk5vcm1hbGl6YXRpb24gb2YgcHJvdGVpbiBDT0wxMUEyKioKYGBge3J9CmdncXFwbG90KHByb3RlaW5zX3NjYWxlZCRDT0wxMUEyKSArCiAgeWxpbSgwLDUpKwogIHhsaW0oMCwzKSsgCiAgbGFicyh0aXRsZSA9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIiLCB4PSBOVUxMLCB5PU5VTEwpCmBgYApUaGUgUVEtcGxvdCBzaG93cyB0aGF0IENPTDExQTIgdmFsdWVzIGZvbGxvdyB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiByZWFzb25hYmx5IHdlbGwsIHdpdGggb25seSBtaWxkIGRldmlhdGlvbnMgaW4gdGhlIHVwcGVyIHRhaWwuCgoKKipOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNldmVyaXR5IGdyb3VwcyoqCmBgYHtyfQpkYXRhX211bHRpdmFyaWF0ZSAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IENPTDExQTIpKSArCiAgZ2VvbV9xcSgpICsgCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X3dyYXAofnNldmVyaXR5KSArCiAgbGFicyggdGl0bGU9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNldmVyaXR5IGdyb3VwcyIgKQpgYGAKV2UgYXNzZXNzZWQgdGhlIG5vcm1hbGl0eSBvZiBDT0wxMUEyIHdpdGhpbiBlYWNoIHNldmVyaXR5IGdyb3VwIHVzaW5nIFFRLXBsb3RzLiBBY3Jvc3MgZ3JvdXBzLCB0aGUgZGlzdHJpYnV0aW9ucyBmb2xsb3cgdGhlIHRoZW9yZXRpY2FsIG5vcm1hbCBsaW5lIHJlYXNvbmFibHkgd2VsbCwgd2l0aCBtaWxkIGRldmlhdGlvbnMsIGVzcGVjaWFsbHkgaW4gdGhlIHNldmVyZSBhbmQgY3JpdGljYWwgY2F0ZWdvcmllcywgbGFyZ2VseSBhdHRyaWJ1dGFibGUgdG8gc21hbGwgc2FtcGxlIHNpemVzIGFuZCBhIGZldyBleHRyZW1lIG9ic2VydmF0aW9ucy4gVGhlc2UgZGV2aWF0aW9ucyBhcmUgbm90IHN1YnN0YW50aWFsIGVub3VnaCB0byB2aW9sYXRlIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBmb3IgdGhlIHN1YnNlcXVlbnQgQU5PVkEuCgoqKk5vcm1hbGl6YXRpb24gb2YgQ09MMTFBMiB3aXRoaW4gc2V4IGdyb3VwcyoqCmBgYHtyfQpkYXRhX211bHRpdmFyaWF0ZSAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IENPTDExQTIpKSArCiAgZ2VvbV9xcSgpICsgCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X3dyYXAofnNleCkrCiAgbGFicyggdGl0bGU9ICJOb3JtYWxpemF0aW9uIG9mIENPTDExQTIgd2l0aGluIHNleCBncm91cHMiICkKYGBgCklOVEVSUFJFVEFUSU9OOgpUaGUgZGlzdHJpYnV0aW9uIGRldmlhdGVzIHNsaWdodGx5IGZyb20gcGVyZmVjdCBub3JtYWxpdHkgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBhIGZldyBvdXRsaWVycywgYnV0IG92ZXJhbGwgdGhlIHJlc2lkdWFsIHBhdHRlcm4gcmVtYWlucyBzdWZmaWNpZW50bHkgY2xvc2UgdG8gbm9ybWFsIGZvciB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIG1vZGVsIHRvIGhvbGQuCgoKKipDaGVjayBhc3N1bXB0aW9ucyBiYXNlZCBvbiBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCoqCmBgYHtyfQpsbV9DT0wxMUEyIDwtIGxtKENPTDExQTIgfiBzZXggKyBzZXZlcml0eSArIHNleCpzZXZlcml0eSwgZGF0YT0gZGF0YV9tdWx0aXZhcmlhdGUpCnBsb3QobG1fQ09MMTFBMikKYGBgCklOVEVSUFJFVEFUSU9OOgoKLSBMaW5lYXJpdHkKVGhlIHJlc2lkdWFscy12ZXJzdXMtZml0dGVkIHBsb3QgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIG1ldC4gVGhlIHNtb290aGluZyBsaW5lIHNob3dzIGFsbW9zdCBubyBjdXJ2YXR1cmUsIGFuZCB0aGUgcmVzaWR1YWxzIGFyZSByYW5kb21seSBzY2F0dGVyZWQgYXJvdW5kIHplcm8sIHN1Z2dlc3Rpbmcgbm8gc3lzdGVtYXRpYyB1bmRlci0gb3Igb3ZlcnByZWRpY3Rpb24uIFRoZSBzcHJlYWQgb2YgcmVzaWR1YWxzIGRvZXMgbm90IHNob3cgYSBmdW5uZWwgc2hhcGUsIGFuZCBhbHRob3VnaCBhIGZldyBvdXRsaWVycyBhcmUgcHJlc2VudCwgdGhleSBkbyBub3QgZGlzdG9ydCB0aGUgb3ZlcmFsbCBwYXR0ZXJuLgoKLSBOb3JtYWxpdHkgb2YgcmVzaWR1YWxzClRoZSBRUS1wbG90IHNob3dzIHRoYXQgbW9zdCByZXNpZHVhbHMgbGllIGNsb3NlIHRvIHRoZSB0aGVvcmV0aWNhbCBub3JtYWwgbGluZSwgd2l0aCBvbmx5IG1pbm9yIHRhaWwgZGV2aWF0aW9ucy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24gaXMgcmVhc29uYWJseSBzYXRpc2ZpZWQuCgotIEhvbW9zY2VkYXN0aWNpdHkgKGVxdWFsIHZhcmlhbmNlKQpUaGUgcmVzaWR1YWwgc3ByZWFkIGFwcGVhcnMgcm91Z2hseSBjb25zdGFudCBhY3Jvc3MgZml0dGVkIHZhbHVlcy4gVGhlIHJlZCBzbW9vdGhpbmcgbGluZSByZW1haW5zIG5lYXJseSBmbGF0IGFuZCBubyBmdW5uZWxpbmcgb3IgY3VydmF0dXJlIGlzIG9ic2VydmVkLCBzdWdnZXN0aW5nIHRoYXQgdGhlIGVxdWFsLXZhcmlhbmNlIGFzc3VtcHRpb24gaXMgbWV0LgoKLSBPdXRsaWVycwpBIHNtYWxsIG51bWJlciBvZiBvdXRsaWVycyBhcmUgdmlzaWJsZSwgYnV0IHRoZXkgYXBwZWFyIHRvIGJlIGlzb2xhdGVkIG9ic2VydmF0aW9ucyByYXRoZXIgdGhhbiBzaWducyBvZiBzdHJ1Y3R1cmFsIHByb2JsZW1zIGluIHRoZSBkYXRhLiBCZWNhdXNlIG5vIGV2aWRlbmNlIG9mIG1lYXN1cmVtZW50IGVycm9yIHdhcyBmb3VuZCwgdGhleSBhcmUgcmV0YWluZWQgaW4gdGhlIGFuYWx5c2lzLgoKCiMgU1RFUCA2OiBUaGUgdHdvLXNhbXBsZSBBbm92YSB0ZXN0CgpCZWNhdXNlIG91ciBkYXRhIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHdlIHNlbGVjdGVkIGEgdHdvLXdheSBBTk9WQSB0byB0ZXN0IG91ciBtdWx0aXZhcmlhdGUgaHlwb3RoZXNpcy4KCmBgYHtyfQphbm92YV9tb2RlbCA8LSBhb3YoIENPTDExQTIgfiBzZXZlcml0eSArIHNleCArIHNldmVyaXR5ICogc2V4ICwgZGF0YSA9IGRhdGFfbXVsdGl2YXJpYXRlKQpzdW1tYXJ5KGFub3ZhX21vZGVsKQpsaWJyYXJ5KGVmZmVjdHNpemUpCgpldGFfc3F1YXJlZChhbm92YV9tb2RlbCkKYGBgCklOVEVSUFJFVEFUSU9OOgpBdCB0aGUgNSUgc2lnbmlmaWNhbmNlIGxldmVsLCB0aGUgdHdvLXdheSBBTk9WQSBzaG93cyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIHN0YW5kYXJkaXplZCBsb2ctdHJhbnNmb3JtZWQgQ09MMTFBMiBleHByZXNzaW9uIChGKDQsIDIzMSkgPSAzNC44LCBwIDwgMC4wMDEpLiBJbiBjb250cmFzdCwgbmVpdGhlciBzZXggKEYoMSwgMjMxKSA9IDEuMTAsIHAgPSAwLjI5Nikgbm9yIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHNleCBhbmQgc2V2ZXJpdHkgKEYoNCwgMjMxKSA9IDAuNDgsIHAgPSAwLjc1MSkgaXMgc2lnbmlmaWNhbnQuIFdlIHRoZXJlZm9yZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBmb3Igc2V2ZXJpdHksIGJ1dCBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzZXMgZm9yIHNleCBhbmQgZm9yIHRoZSBzZXgtc2V2ZXJpdHkgaW50ZXJhY3Rpb24uCgplZmZlY3Qgc2l6ZToKQ09WSUQtMTkgc2V2ZXJpdHkgc2hvd3MgYSBsYXJnZSBlZmZlY3Qgb24gQ09MMTFBMiBleHByZXNzaW9uIChwYXJ0aWFsIM63wrIgPSAwLjM4KSwgaW5kaWNhdGluZyB0aGF0IGFwcHJveGltYXRlbHkgMzglIG9mIHRoZSB2YXJpYW5jZSBpcyBleHBsYWluZWQgYnkgc2V2ZXJpdHkuIEluIGNvbnRyYXN0LCBzZXggYW5kIHRoZSBzZXjDl3NldmVyaXR5IGludGVyYWN0aW9uIGhhdmUgbmVnbGlnaWJsZSBlZmZlY3Qgc2l6ZXMgKHBhcnRpYWwgzrfCsiA8IDAuMDEpLgoKVGhlIGFub3ZhIG1vZGVsIHdhcyByZXBlYXRlZCBmb3IgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gQ09MMTFBMiBhbmQgc2V2ZXJpdHkgdG8gdXNlIGZvciB0aGUgcG9zdCBob2MgYW5hbHlzaXMgCmBgYHtyfQpzaWduX2Fub3ZhIDwtIGFvdiggQ09MMTFBMiB+IHNldmVyaXR5ICwgZGF0YSA9IGRhdGFfbXVsdGl2YXJpYXRlKQpzdW1tYXJ5KHNpZ25fYW5vdmEpCmBgYAoKI1NURVAgNzogUG9zdCBob2MgYW5hbHlzZQoKV2Uga25vdyB0aGF0IENvdmlkLTE5IHNldmVyaXR5IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiB0aGUgZXhwcmVzc2lvbiBvZiBDT0wxMUEyLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBkbyBhIFBvc3QtaG9jIHRlc3QgdG8gZmluZCBvdXQgZm9yIHdoaWNoIGdyb3VwcyB0aGUgZXhwcmVzc2lvbiBpcyBzaWduaWZpY2FudGlseSBkaWZmZXJlbnQuCgoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJtdWx0Y29tcCIpCmxpYnJhcnkobXVsdGNvbXApCgptY3AgPC0gZ2xodChzaWduX2Fub3ZhLGxpbmZjdCA9IG1jcCAoc2V2ZXJpdHkgPSAnVHVrZXknICkpCnN1bW1hcnkobWNwKQpgYGAKCmBgYHtyfQpjb25maW50KG1jcCkKCgpwYXIobWFyID0gYyg1LCAxMiwgNCwgMikpICMgYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0CnBsb3QobWNwKQpgYGAKSU5URVJQUkVUQVRJT046ClRoZSBUdWtleSBwb3N0LWhvYyB0ZXN0IHNob3dzIHRoYXQgbWVhbiBzdGFuZGFyZGl6ZWQgbG9nLUNPTDExQTIgZXhwcmVzc2lvbiBpcyBzaWduaWZpY2FudGx5IGxvd2VyIGluIGFsbCBDT1ZJRC0xOSBzZXZlcml0eSBncm91cHMgKG1pbGQsIG1vZGVyYXRlLCBzZXZlcmUsIGNyaXRpY2FsKSBjb21wYXJlZCB3aXRoIHRoZSBORUdBVElWRSBncm91cCAoYWxsIGFkanVzdGVkIHAgPCAwLjAwMSkuIEZvciBleGFtcGxlLCB0aGUgY3JpdGljYWwgZ3JvdXAgaGFzIG9uIGF2ZXJhZ2UgMi4wNiBzdGFuZGFyZCB1bml0cyBsb3dlciBDT0wxMUEyIGV4cHJlc3Npb24gdGhhbiB0aGUgTkVHQVRJVkUgZ3JvdXAgKGVzdGltYXRlID0g4oiSMi4wNiwgOTUlIENJIFviiJIyLjczLCDiiJIxLjM5XSkuIEluIGFkZGl0aW9uLCBlYWNoIHN1Y2Nlc3NpdmUgaW5jcmVhc2UgaW4gc2V2ZXJpdHkgZnJvbSBtaWxkIHRvIG1vZGVyYXRlLCBzZXZlcmUgYW5kIGNyaXRpY2FsIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNpZ25pZmljYW50IGZ1cnRoZXIgZGVjcmVhc2UgaW4gQ09MMTFBMiBleHByZXNzaW9uIChhbGwgYWRqdXN0ZWQgcCA8IDAuMDUpLCBleGNlcHQgZm9yIHRoZSBjb250cmFzdCBiZXR3ZWVuIHNldmVyZSBhbmQgY3JpdGljYWwsIHdoZXJlIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpbmNsdWRlcyB6ZXJvIChlc3RpbWF0ZSA9IOKIkjAuMjksIDk1JSBDSSBb4oiSMS4wMywgMC40NV0sIHAgPSAwLjgyKS4gQXQgYSBnbG9iYWwgNSUgc2lnbmlmaWNhbmNlIGxldmVsIHdlIHRoZXJlZm9yZSBjb25jbHVkZSB0aGF0IENPTDExQTIgZXhwcmVzc2lvbiBkZWNyZWFzZXMgcHJvZ3Jlc3NpdmVseSB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHkuCgoqKlZpc3VhbGlzYXRpb24qKgoKVGhpcyBib3hwbG90cyBzdXBwb3J0cyB0aGUgcmVzdWx0cyBvYnRhaW5lZCB2aWEgdGhlIHR3by13YXkgQU5PVkEgdGVzdApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKCmdncGxvdChkYXRhX211bHRpdmFyaWF0ZSwgYWVzKHggPSBzZXZlcml0eSwgeSA9IENPTDExQTIsIGZpbGwgPSBzZXgpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXJzID0gRkFMU0UpICsKICBnZW9tX2ppdHRlciAod2lkdGggPTAuMTUsIGFscGhhID0wLjQsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVGhlIGVmZmVjdCBvZiBzZXggYW5kIENvdmlkLTE5IHNldmVyaXR5IG9uIENPTDExQTIgZXhwcmVzc2lvbiIsIHggPSAic2V2ZXJpdHkgZ3JvdXBzIiwgeSA9ICJTdGFuZGFyZGl6ZWQgbG9nKENPTDExQTIpIGV4cHJlc3Npb24iKQoKYGBgCkZJTkFMIENPTkNMVVNJT046CgpIMGEgKHNldmVyaXR5KTogV2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgKHAgPCAwLjAwMSkuIENPVklELTE5IHNldmVyaXR5IGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiBzdGFuZGFyZGl6ZWQgbG9nLUNPTDExQTIgZXhwcmVzc2lvbi4gQm90aCB0aGUgQU5PVkEgYW5kIFR1a2V5IHBvc3QtaG9jIHRlc3RzIHNob3cgYSBwcm9ncmVzc2l2ZSBkZWNyZWFzZSBpbiBDT0wxMUEyIGxldmVscyBmcm9tIE5FR0FUSVZFIOKGkiBtaWxkIOKGkiBtb2RlcmF0ZSDihpIgc2V2ZXJlIOKGkiBjcml0aWNhbCwgd2l0aCBhbGwgcGFpcndpc2UgZGlmZmVyZW5jZXMgc2lnbmlmaWNhbnQgZXhjZXB0IHNldmVyZeKAk2NyaXRpY2FsLiBUaGUgYm94cGxvdCB2aXN1YWxseSBjb25maXJtcyB0aGlzIGRvd253YXJkIHRyZW5kLCBpbmRpY2F0aW5nIHRoYXQgQ09MMTFBMiBpcyBzdHJvbmdseSBkb3ducmVndWxhdGVkIGFzIGRpc2Vhc2Ugc2V2ZXJpdHkgaW5jcmVhc2VzLgoKSDBiIChzZXgpOiBXZSBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgKHAgPSAwLjMwKS4gVGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIG1lYW4gQ09MMTFBMiBleHByZXNzaW9uIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBhdGllbnRzLiBUaGUgZmlndXJlIHNob3dzIHN1YnN0YW50aWFsIG92ZXJsYXAgYmV0d2VlbiBzZXhlcyBpbiBlYWNoIHNldmVyaXR5IGNhdGVnb3J5LCBzdXBwb3J0aW5nIHRoaXMgcmVzdWx0LgoKSDBjIChpbnRlcmFjdGlvbik6IFdlIGRvIG5vdCByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyAocCA9IDAuNzUpLiBUaGUgZWZmZWN0IG9mIENPVklELTE5IHNldmVyaXR5IG9uIENPTDExQTIgZXhwcmVzc2lvbiBkb2VzIG5vdCBkaWZmZXIgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcy4gVGhlIGJveHBsb3Qgc2hvd3Mgc21hbGwgYXBwYXJlbnQgc2V4IGRpZmZlcmVuY2VzIG9ubHkgaW4gdGhlIHNldmVyZSBhbmQgY3JpdGljYWwgZ3JvdXBzLCBidXQgdGhlc2UgcGF0dGVybnMgYXJlIGxpa2VseSBkdWUgdG8gbGltaXRlZCBhbmQgaW1iYWxhbmNlZCBzYW1wbGUgc2l6ZXMgcmF0aGVyIHRoYW4gYSB0cnVlIGludGVyYWN0aW9uLgoKT3ZlcmFsbCBjb25jbHVzaW9uOgpPdmVyYWxsLCBDT0wxMUEyIGV4cHJlc3Npb24gZGVjcmVhc2VzIGNvbnNpc3RlbnRseSB3aXRoIGluY3JlYXNpbmcgQ09WSUQtMTkgc2V2ZXJpdHksIGluZGljYXRpbmcgYSBzdHJvbmcgYW5kIHNpZ25pZmljYW50IHNldmVyaXR5IGVmZmVjdCB2aXNpYmxlIGluIGJvdGggdGhlIHN0YXRpc3RpY2FsIHRlc3RzIGFuZCB0aGUgZmluYWwgZmlndXJlLiBTZXggYW5kIHRoZSBzZXjDl3NldmVyaXR5IGludGVyYWN0aW9uIGFyZSBub3Qgc2lnbmlmaWNhbnQsIGFuZCB0aGUgbWlub3IgdmlzdWFsIGRpZmZlcmVuY2VzIGluIHRoZSBtb3N0IHNldmVyZSBncm91cHMgbGlrZWx5IHJlZmxlY3Qgc21hbGwgc2FtcGxlIHNpemVzIHJhdGhlciB0aGFuIHRydWUgYmlvbG9naWNhbCBlZmZlY3RzLiBUaHVzLCB0aGUgc2V2ZXJpdHktcmVsYXRlZCBkZWNsaW5lIGluIENPTDExQTIgYXBwZWFycyByb2J1c3QgYW5kIGluZGVwZW5kZW50IG9mIHBhdGllbnQgc2V4LgoK